package controller

import (
	"fmt"
	"frontend-server/dao"
	model "frontend-server/model/gv_im"
	"frontend-server/util"

	"github.com/gin-gonic/gin"
	"github.com/spf13/cast"
)

type AddressbookController struct{}

// 查询用户好友列表
func (AddressbookController) Pagefriend(ctx *gin.Context) {
	id, _ := ctx.Get("id")
	// 根据登陆id过滤用户房间
	userRooms, err := dao.GetGvImUserRoomByUserIDRoomType1(cast.ToUint(id))
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	// 根据用户房间过滤用户好友
	userFriendRooms, err := dao.GetGvImUserRoomByUserRooms(userRooms)
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	// 根据用户好友查询用户信息
	users, err := dao.GetGvImUserByUserRooms(userFriendRooms)
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	util.Success(ctx, util.R{
		P: util.P{
			Code:    200,
			Message: "获取成功",
			Params: gin.H{
				"data": users,
			},
		},
	})
	fmt.Println(userRooms)
}

// 添加好友
func (AddressbookController) AddFriend(ctx *gin.Context) {
	id, _ := ctx.Get("id")
	email := ctx.PostForm("email")
	phone := ctx.PostForm("phone")
	if email == "" && phone == "" {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "参数不正确",
			},
		})
		return
	}
	// 查询用户信息
	user, err := dao.GetGvImUserByEmailOrPhone(email, phone)
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	// 检测添加好友是否为自己
	if cast.ToUint(id) == user.ID {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "你们当前已经是好友",
			},
		})
		return
	}
	// 查询用户是否为好友
	if dao.GetGvImUserRoomByIsFriend(user.ID, cast.ToUint(id)) {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "你们当前已经是好友",
			},
		})
		return
	}
	// 创建房间记录
	room, err := dao.CreateGvImRoom(model.GvImRoom{
		UserID: cast.ToUint(id),
	})
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	// 创建用户与房间的关联记录
	err = dao.CreateGvImUserRoom(model.GvImUserRoom{
		UserID:   cast.ToUint(id),
		RoomID:   room.ID,
		RoomType: 1,
	})
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	err = dao.CreateGvImUserRoom(model.GvImUserRoom{
		UserID:   user.ID,
		RoomID:   room.ID,
		RoomType: 1,
	})
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	util.Success(ctx, util.R{
		P: util.P{
			Code:    200,
			Message: "添加成功",
		},
	})
}

// 好友信息
func (AddressbookController) FriendInfo(ctx *gin.Context) {
	id, _ := ctx.Get("id")
	email := ctx.PostForm("email")
	phone := ctx.PostForm("phone")
	if email == "" && phone == "" {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "参数不正确",
			},
		})
		return
	}
	user, err := dao.GetGvImUserByEmailOrPhone(email, phone)
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	data := dao.UserResult{
		ID:       user.ID,
		Nickname: user.Nickname,
		Sex:      user.Sex,
		Email:    user.Email,
		Phone:    user.Phone,
		Avatar:   user.Avatar,
		IsFriend: false,
	}
	if dao.GetGvImUserRoomByIsFriend(cast.ToUint(id), user.ID) {
		data.IsFriend = true
	}
	util.Success(ctx, util.R{
		P: util.P{
			Code:    200,
			Message: "获取成功",
			Params: gin.H{
				"data": data,
			},
		},
	})
}

// 删除好友
func (AddressbookController) DelFriend(ctx *gin.Context) {
	id, _ := ctx.Get("id")
	friendID := ctx.PostForm("id")
	if friendID == "" {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "参数不正确",
			},
		})
		return
	}
	// 获取房间 id
	u := dao.GetGvImUserRoomByID(cast.ToUint(id), cast.ToUint(friendID))
	if u == 0 {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "你们当前还不是好友",
			},
		})
		return
	}
	// 删除user_room关联
	err := dao.DeleteGvImUserRoomByID(u)
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	// 删除房间
	err = dao.DeleteGvImRoomByID(u)
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	util.Success(ctx, util.R{
		P: util.P{
			Code:    200,
			Message: "删除好友成功",
		},
	})
}

// 创建群聊
func (AddressbookController) AddGroup(ctx *gin.Context) {
	id, _ := ctx.Get("id")
	// 映射用户id
	var ids dao.UserIDSResult
	err := ctx.ShouldBindJSON(&ids)
	if err != nil {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "参数不正确",
			},
		})
	}
	// 检测值是否为空
	if len(ids.IDS) == 0 {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "参数不能为空",
			},
		})
		return
	}
	// id去重
	tmpIDS := util.DeduplicationSliceUint(ids.IDS)
	// 删除包含创建者id
	IDS := util.DeleteSliceUint(cast.ToUint(id), tmpIDS)
	// 检测创建房间用户是否为自己好友
	// isFriend := dao.GetGvImUserRoomByIsFriends(cast.ToUint(id), IDS)
	// fmt.Println(IDS, isFriend)
	// if !isFriend {
	// 	util.Success(ctx, util.R{
	// 		P: util.P{
	// 			Code:    -1,
	// 			Message: "你们还不是好友",
	// 		},
	// 	})
	// 	return
	// }
	// return
	// 查询用户列表
	users, err := dao.GetGvImUserByIDS(IDS)
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	fmt.Println(len(users))
	// 创建房间
	room, err := dao.CreateGvImRoom(model.GvImRoom{
		UserID: cast.ToUint(id),
		Number: util.GenerateUUID(),
	})
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	// 创建管理员与房间的关联记录
	err = dao.CreateGvImUserRoom(model.GvImUserRoom{
		UserID:   cast.ToUint(id),
		RoomID:   room.ID,
		RoomType: 2,
	})
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	// 创建其他用户与房间的关联记录
	err = dao.CreateGvImUserRooms(room.ID, users)
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	util.Success(ctx, util.R{
		P: util.P{
			Code:    200,
			Message: "创建成功",
		},
	})
}

// 删除群聊
func (AddressbookController) DelGroup(ctx *gin.Context) {
	id, _ := ctx.Get("id")
	roomid := ctx.PostForm("id")
	number := ctx.PostForm("number")
	if roomid == "" || number == "" {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "参数不正确",
			},
		})
		return
	}
	// 获取房间id
	room, err := dao.GetGvImRoomByUserIDRoomIDNumber(cast.ToUint(id), cast.ToUint(roomid), cast.ToString(number))
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	// 删除房间
	err = dao.DeleteGvImRoomByID(room.ID)
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	// 删除用户与房间关联
	err = dao.DeleteGvImUserRoomByID(room.ID)
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	util.Success(ctx, util.R{
		P: util.P{
			Code:    200,
			Message: "删除成功",
		},
	})
}

// 查询用户群列表
func (AddressbookController) PageGroup(ctx *gin.Context) {
	id, _ := ctx.Get("id")
	userRooms, err := dao.GetGvImUserRoomByUserIDRoomType2(cast.ToUint(id))
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	rooms, err := dao.GetGvImRoomByUserRooms(userRooms)
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	util.Success(ctx, util.R{
		P: util.P{
			Code:    200,
			Message: "获取成功",
			Params: gin.H{
				"data": rooms,
			},
		},
	})
}
